package com.cy.config;

import com.cy.handler.DefaultAuthenticationFailureHandler;
import com.cy.handler.DefaultAuthenticationSuccessHandler;
import com.cy.handler.RedirectAuthenticationSuccessFailureHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

/**
     * 由@Configuration注解描述的类为spring中的配置类,配置类会在spring
     * 工程启动时优先加载,在配置类中通常会对第三方资源进行初始配置.
     */
    @EnableGlobalMethodSecurity(prePostEnabled = true)  //prepost表示启动权限管理功能
    @Configuration
    public class Securityconfig extends WebSecurityConfigurerAdapter {
        /**
         * 定义SpringSecurity密码加密对象
         * @Bean 注解通常会在@Configuration注解描述的类中描述方法,
         * 用于告诉spring框架这个方法的返回值会交给spring管理,并spring
         * 管理的这个对象起个默认的名字,这个名字与方法名相同,当然也可以通过
         * @Bean注解起名字
         */
        @Bean //对象名默认为方法名
        //@Bean("bcryptPasswordEncoder")//bean对象名字为bcryptPasswordEncoder
        public BCryptPasswordEncoder passwordEncoder(){
            return new BCryptPasswordEncoder();
        }

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            //super.configure(http);
            //关闭跨域攻击，不关闭容易出错
            http.csrf().disable();
            //自定义登陆表单
            http.formLogin()
                    //设置登陆页面
                    .loginPage("/login.html")
                    //设置登陆请求处理地址(对应form表单中的action),登陆时会访问UserDetailService对象
                    .loginProcessingUrl("/login")
                    //设置请求用户名参数为username(默认就是username，可以自己修改，需要与表单同步)
                    .usernameParameter("username")
                    //请求请求密码参数为password(默认就是password，可以自己修改，需要与表单同步)
                    .passwordParameter("password")
                    //设置登陆成功跳转页面(默认为/index.html)
                    .successHandler(new DefaultAuthenticationSuccessHandler())
                    //登陆失败访问的页面（默认为/login.html?error）
                    .failureHandler(new DefaultAuthenticationFailureHandler());
            //认证设计
            http.authorizeRequests()
                    .antMatchers(   //配置下列路径的授权
                            "/index.html",
                            "/js/*",
                            "/css/*",
                            "/img/**",
                            "/bower_components/**",
                            "/login.html"
                    ).permitAll();   //设置上述所有路径不需要登录就能访问(放行)
            http.logout()       //开始设置登出信息
                    .logoutUrl("/logout")   //登出路径
                    .logoutSuccessUrl("/login.html?logout");//设置登出后显示的页面

        }
    }
